#include "ClaveVariable.h"
#include "../funciones.h"
#include "../DatoBSharp.h"

namespace Toolkit
{

ClaveVariable::ClaveVariable(const unsigned long int &tamano,
        const char &primeraLetra)
{
    this->tamano = tamano;
    this->primeraLetra = primeraLetra;
}

ClaveVariable::~ClaveVariable()
{
}

void ClaveVariable::serializar(stringstream &s) const
{
    serializacionDigito(s, BINARIO, tamano);

    s.write(&primeraLetra, sizeof(char));

    string cadena;
    cadena.append(tamano - sizeof(int) - sizeof(char), '#');
    s.write(cadena.c_str(), cadena.size());
}

void ClaveVariable::hidratar(stringstream &s)
{
    hidratacionDigito(s, BINARIO, tamano);

    s.read(&primeraLetra, sizeof(char));
}

bool ClaveVariable::operator ==(const Clave& otra) const
{
    return this->primeraLetra == ((ClaveVariable&) otra).primeraLetra;
}

bool ClaveVariable::operator ==(const Dato& dato) const
{
    return (*this) == (*((DatoBSharp&) dato).getClave());
}

bool ClaveVariable::operator <(const Clave &otra) const
{
    return this->primeraLetra < ((ClaveVariable&) otra).primeraLetra;
}

bool ClaveVariable::operator <(const Dato &dato) const
{
    return (*this) < (*((DatoBSharp&) dato).getClave());
}

Clave* ClaveVariable::clonar() const
{
    return new ClaveVariable(tamano, primeraLetra);
}

char ClaveVariable::getLetra() const
{
    return this->primeraLetra;
}

Clave* ClaveVariable::crearDesdeDato(const Dato&) const
{
    return new ClaveVariable(tamano, primeraLetra);
}

}
